package com.ruoyi.common.utils;

import cn.hutool.core.bean.BeanUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.utils.sql.SqlUtil;
import org.apache.poi.ss.formula.functions.T;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页工具类
 *
 * @author ruoyi
 */
public class PageUtils extends PageHelper {
    /**
     * 设置请求分页数据
     */
    public static void startPage() {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }

    // 泛型方法，将 PageInfo 对象复制到另一个 PageInfo 对象
    public static <T> PageInfo<T> copyPage(PageInfo<?> sourcePage, Class<T> targetType) {
        // 创建新的 PageInfo 对象
        PageInfo<T> pageInfo = new PageInfo<>();

        // 获取源列表
        List<?> sourceList = sourcePage.getList();

        // 判断源列表元素的类型，并根据目标类型进行转换
        List<T> targetList = new ArrayList<>();
        for (Object sourceElement : sourceList) {
            if (sourceElement != null) {
                // 你需要根据目标类型的需求来转换元素
                // 这里使用 BeanUtil.copyProperties() 进行属性复制，假设源对象可以转换为目标类型
                T targetElement = BeanUtil.copyProperties(sourceElement, targetType);
                targetList.add(targetElement);
            }
        }

        // 设置新的列表和总数
        pageInfo.setList(targetList);
        pageInfo.setTotal(sourcePage.getTotal());

        // 复制其他分页信息
        pageInfo.setPageNum(sourcePage.getPageNum());
        pageInfo.setPageSize(sourcePage.getPageSize());
        pageInfo.setSize(sourcePage.getSize());

        return pageInfo;
    }

    /**
     * 清理分页的线程变量
     */
    public static void clearPage() {
        PageHelper.clearPage();
    }
}
